package example.proxy.CGLIBProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 使用CGLIB动态代理直接完成对一个类的代理，对write()添加功能
 * 需要增加jvm环境变量：
 * --add-opens java.base/java.lang=ALL-UNNAMED
 * --add-exports java.base/jdk.internal.module=ALL-UNNAMED
 */
public class CGLIBProxy {
    public static void main(String[] args) {

        // 创建被代理对象
        VocalConcert vocalConcert = new VocalConcert();

        // 使用CGLIB的Enhancer类创建代理对象
        VocalConcert cglib = (VocalConcert) Enhancer.create(VocalConcert.class, new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object result=null;
                System.out.println("对方法执行前进性代理增强...写之前");
                result=method.invoke(vocalConcert, objects[0]);
                System.out.println("对方法执行后进性代理增强...写之后");
                return result;
            }
        });

        // 执行功能
        cglib.write("正在写");
    }
}
